package modelo
import scala.collection.mutable.ArrayBuffer
import scala.util.control.Exception
import exepciones.CanchaExeption


abstract class Cancha(var id : Int) {
  var reservas = new ArrayBuffer[Reserva]
  
  def precio() : Double
  def calcularPrecio(reserva:Reserva) = precio
  def estaAbierta(hora:Int)= hora <= 18
  
  def reservar(dia:Int, hora:Int) {
    var reser = new Reserva(dia, hora, hora+1)
    if(this.isReservable(reser) && estaAbierta(hora)){
    	reser.precio = calcularPrecio(reser)
    	this.reservas += reser
    }else{
    	throw new CanchaExeption("Horario Ocupado o esta cerrada")
    } 
}
  
  def tenesReservaEl(dia : Int): Boolean ={
    return this.reservas.exists(_.sosDelDia(dia))
  }
  
  
//  def imprimirReservasDelDia(dia : Int){
//    this.reservas.foreach(_.imprimirDelDia(dia))
//  }
  
  def reservasDelDia(dia:Int): ArrayBuffer[Reserva] ={
    return this.reservas.filter(_.sosDelDia(dia))
  }
  
  def getReserva(dia:Int, hora:Int): Reserva = {
  	reservas.find(r=> r.dia == dia && r.horaInicio == hora).getOrElse(null)
  	// opcion 2: con exception y pattern matching
//  	reservas.find(r=> r.dia == dia && r.horaInicio == hora) match {
//  	  case Some(v) => v
//  	  case None => throw new ....
//  	}
  	
  }
  
  def isReservable(reserva : Reserva): Boolean = {
//     !this.reservas.exists{res => res.dia == dia && res.horaInicio == hora}
     !reservas.exists(_.seSolapaCon(reserva))
  }
  
   def totalRecaudado():Double = {
    var tot = reservas map {r => r.precio}
    return tot.sum
    
//    var reservasCosto = reservas map {r => r.costo}
//    return reservasCosto.sum
  }
  
}

